#include <vector>
#include <iostream>

using namespace std;

/* 
    vector 是 C++ 标准模板库（STL）中的一个序列容器，提供了动态数组的功能。
    它允许在数组末尾添加或删除元素，并且可以动态调整大小。
    vector 的基本操作：
    push_back(x)：在数组末尾添加元素 x。
    pop_back()：删除数组最后一个元素。
    front()：访问数组第一个元素。
    back()：访问数组最后一个元素。
    size()：返回数组中元素的个数。
    empty()：判断数组是否为空。
    insert(pos, x)：在指定位置 pos 插入元素 x。
    erase(pos)：删除指定位置 pos 的元素。
    swap(a, b)：交换两个元素 a 和 b 的值。
*/


void vector_init()
{
    // Create a vector of integers
    int n = 7, m = 8;

    // 初始化为一 int 型的空数组nums
    vector<int> nums;

    vector<int> numx(n); // 初始化为大小为 n 的 int 型数组，元素值默认初始化为 0

    vector<int> numy{1, 3, 5}; // 初始化为包含 1, 3, 5 的 int 型数组

    vector<int> numz(n, m); // 初始化为大小为 n 的 int 型数组，所有元素值均为 m

    vector<vector<int>> dp; // 初始化为二维空数组

    vector<vector<int>> dp2(n, vector<int>(m)); // 初始化为 n 行 m 列的二维数组，元素值默认初始化为 0
}

int main()
{
    int n = 10;
    
    vector<int> nums(n); // 初始化为大小为 n 的 int 型数组，元素值默认初始化为 0

    cout << "Size of nums: " << nums.size() << endl;

    cout << "nums is: empty "<< (nums.empty() ? "true" : "false") << endl;

    nums.push_back(10); // 在数组末尾添加元素 10
    cout << "After push_back(10), size of nums: " << nums.size() << endl;

    cout << "size of nums: " << nums.size() << endl;

    cout << nums.back() << endl; // 访问数组最后一个元素

    nums.pop_back(); // 删除数组最后一个元素
    cout << "After pop_back(), size of nums: " << nums.size() << endl;

    nums[1] = 20; // 通过下标访问和修改数组元素
    cout << "After nums[1] = 20, size of nums: " << nums.size() << endl;
    nums.insert(nums.begin()+ 4, 10); // 在下标为 4 的位置插入元素 10
    cout << "After insert 10 at index 4, size of nums: " << nums.size() << endl;

    nums.erase(nums.begin() + 2); // 删除下标为 2 的元素
    cout << "After erase element at index 2, size of nums: " << nums.size() << endl;

    swap(nums[0], nums[1]); // 交换下标为 0 和 1 的元素
    cout << "After swap elements at index 0 and 1, size of nums: " << nums.size() << endl;

    for (int i = 0; i < nums.size(); i++)
    {
        cout << "nums[" << i << "] = " << nums[i] << " ,";  
    }
    cout << endl;

    return 0;
}
